package main

import (
	"fmt"
	"log"
	"os"
	"path/filepath"

	"b2c-delivery-optimization/internal/api"
	"b2c-delivery-optimization/internal/config"
	"b2c-delivery-optimization/internal/services"
	"b2c-delivery-optimization/internal/utils"

	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
)

func init() {
	fmt.Print("程序开始运行...\n")
	os.Stdout.Sync()

	// 配置日志输出
	log.SetOutput(os.Stdout)
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

	fmt.Print("正在初始化...\n")
	os.Stdout.Sync()

	// 获取当前工作目录
	wd, err := os.Getwd()
	if err != nil {
		fmt.Printf("Error getting working directory: %s\n", err)
		os.Exit(1)
	}
	fmt.Printf("当前工作目录: %s\n", wd)
	os.Stdout.Sync()

	// 检查配置文件路径
	configPath := filepath.Join(wd, "config")
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		fmt.Printf("Config directory not found at: %s\n", configPath)
		configPath = filepath.Join(filepath.Dir(wd), "config")
		if _, err := os.Stat(configPath); os.IsNotExist(err) {
			fmt.Printf("Config directory not found at: %s\n", configPath)
		} else {
			fmt.Printf("Config directory found at: %s\n", configPath)
		}
	} else {
		fmt.Printf("Config directory found at: %s\n", configPath)
	}
	os.Stdout.Sync()

	// 加载配置文件
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("../config")
	viper.AddConfigPath("./config")

	if err := viper.ReadInConfig(); err != nil {
		fmt.Printf("Error reading config file: %s\n", err)
		os.Exit(1)
	}
	fmt.Printf("Config file used: %s\n", viper.ConfigFileUsed())
	fmt.Println("Config loaded successfully")
	os.Stdout.Sync()

	// 初始化数据库连接
	if _, err := utils.InitDB(); err != nil {
		fmt.Printf("Error initializing database: %s\n", err)
		os.Exit(1)
	}
	fmt.Println("Database initialized successfully")
	os.Stdout.Sync()

	// 运行数据库迁移
	if err := utils.RunMigrations(); err != nil {
		fmt.Printf("Error running migrations: %s\n", err)
		os.Exit(1)
	}
	fmt.Println("Database migrations completed")
	os.Stdout.Sync()
}

func main() {
	// 加载配置
	cfg, err := config.LoadConfig()
	if err != nil {
		log.Fatalf("Failed to load config: %v", err)
	}

	// 使用已初始化的数据库连接
	db := utils.DB

	// 确保在程序退出时关闭数据库连接
	defer utils.CloseDB()

	// 创建服务实例
	waveService := services.NewWaveService(db)

	// 创建Gin引擎
	r := gin.Default()

	// 设置路由
	api.SetupRoutes(r, waveService)

	fmt.Println("Starting HTTP server on", cfg.Server.Address)
	// 启动服务器
	if err := r.Run(cfg.Server.Address); err != nil {
		log.Fatalf("Failed to start server: %v", err)
	}
}
